package com.aluka.nirvana.framework.core.context;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

/**
 * Spring上下文管理工具
 * @author gongli
 * @since 2019/12/25
 */
@Component
public class SpringContextAware implements ApplicationContextAware {
	private static ApplicationContext APPLICATION_CONTEXT;

	@Override
	public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
		SpringContextAware.APPLICATION_CONTEXT = applicationContext;
	}

	/**
	 * 获取上下文
	 * 
	 * @return Spring上下文
	 */
	public static ApplicationContext getApplicationContext() {
		return APPLICATION_CONTEXT;
	}

	/**
	 * 获取Spring配置
	 * 
	 * @param key 配置名称
	 * @return 配置值
	 */
	public static String getProperties(String key) {
		return APPLICATION_CONTEXT.getEnvironment().getProperty(key);
	}

	/**
	 * 获取Spring配置<br>
	 * 没有配置时，返回默认值
	 * 
	 * @param key 配置名称
	 * @param defaultValue 默认值
	 * @return 配置值
	 */
	public static String getProperties(String key, String defaultValue) {
		return APPLICATION_CONTEXT.getEnvironment().getProperty(key, defaultValue);
	}

	/**
	 * 获取Spring配置<br>
	 * 没有配置时，返回默认值
	 *
	 * @param key 配置名称
	 * @param defaultValue 默认值
	 * @return 配置值
	 */
	public static Integer getIntProperties(String key, Integer defaultValue) {
		String pro = APPLICATION_CONTEXT.getEnvironment().getProperty(key);
		return Integer.valueOf(StringUtils.isBlank(pro) ? defaultValue.toString() : pro);
	}

	/**
	 * 获取Spring配置<br>
	 * 没有配置时，返回默认值
	 *
	 * @param key 配置名称
	 * @return 配置值
	 */
	public static Integer getIntProperties(String key) {
		String pro = APPLICATION_CONTEXT.getEnvironment().getProperty(key);
		return Integer.valueOf(pro);
	}

	/**
	 * 获取Spring配置<br>
	 * 没有配置时，返回默认值
	 *
	 * @param key 配置名称
	 * @param defaultValue 默认值
	 * @return 配置值
	 */
	public static Long getLongProperties(String key, Long defaultValue) {
		String pro = APPLICATION_CONTEXT.getEnvironment().getProperty(key);
		return Long.valueOf(StringUtils.isBlank(pro) ? defaultValue.toString() : pro);
	}

	/**
	 * 获取Spring配置<br>
	 * 没有配置时，返回默认值
	 *
	 * @param key 配置名称
	 * @return 配置值
	 */
	public static Long getLongProperties(String key) {
		String pro = APPLICATION_CONTEXT.getEnvironment().getProperty(key);
		return Long.valueOf(pro);
	}

	/**
	 * 获取Spring配置<br>
	 * 没有配置时，返回默认值
	 *
	 * @param key 配置名称
	 * @param defaultValue 默认值
	 * @return 配置值
	 */
	public static Boolean getBooleanProperties(String key, Boolean defaultValue) {
		String pro = APPLICATION_CONTEXT.getEnvironment().getProperty(key, defaultValue.toString());
		return Boolean.valueOf(StringUtils.isBlank(pro) ? defaultValue.toString() : pro);
	}

	/**
	 * 获取Spring配置<br>
	 * 没有配置时，返回默认值
	 *
	 * @param key 配置名称
	 * @return 配置值
	 */
	public static Boolean getBooleanProperties(String key) {
		String pro = APPLICATION_CONTEXT.getEnvironment().getProperty(key);
		return Boolean.valueOf(pro);
	}

	/**
	 * @return 获取Spring服务名称
	 */
	public static String getApplicationName() {
		return APPLICATION_CONTEXT.getApplicationName();
	}
	
	/**
	 * 获取spring容器中注册的bean
	 * @param name bean's name
	 * @return bean
	 */
	public static Object getBean(String name) {
		try {
			return getApplicationContext().getBean(name);
		} catch (Exception ignore) {
			
		}
		return null;
		
	}

	public static <T> T getBean(Class<T> clazz) {
		try {
			return getApplicationContext().getBean(clazz);
		} catch (Exception ignore) {
			
		}
		return null;
	}
	public static <T> T getBean(String name ,Class<T> clazz) {
		try {
			return getApplicationContext().getBean(name,clazz);
		} catch (Exception ignore) {
			
		}
		return null;
		
	}
}
